package com.whz.generic.parameter;

import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * SPel表达式分析器
 *
 * @author whz
 * 2021/8/13
 */
public class ExpressionParser {
    private final org.springframework.expression.ExpressionParser parser = new SpelExpressionParser();
    private final StandardEvaluationContext ctx;

    public ExpressionParser(Object target) {
        ctx = new StandardEvaluationContext();
        // #类名.
        ctx.setVariable(target.getClass().getSimpleName(), target);
        // #root.
        ctx.setRootObject(target);
    }

    /**
     * 转换SPel表达式,从root对象中查找
     *
     * @param expressionString SPel表达式:支持#root.xxx或者#类名.xxx
     * @return 表达式的值
     */
    public Object parseExpression(String expressionString) {
        return parser.parseExpression(expressionString).getValue(ctx);
    }

    /**
     * 转换SPel表达式,从root对象中查找
     *
     * @param expressionString  SPel表达式
     * @param desiredResultType 返回的类型
     * @param <T>               参数类型
     * @return T类型的值
     */
    public <T> T parseExpression(String expressionString, Class<T> desiredResultType) {
        return parser.parseExpression(expressionString).getValue(ctx, desiredResultType);
    }
}
